#!/usr/bin/env python
#-*- coding:utf-8 -*-

"""
    PySeq0 - a python sequencer
    (c) by Tobias Sauer 2011
    Copyright: GPL v2 only
    http://leichtdio.de
    tobias@leichtdio.de
    
    Google Code:
    http://pyseq0.leichtdio.de
    
    
    ToDo:
        AutoClean einbauen, damit alle nicht in Index vorhandenen Loops aus
        dem Dict geschmissen werden und somit nicht mehr aufgerufen!
"""

import thread
import time

import logging
_log = logging.getLogger("Clock")

class BeatClock:
    """
       BeatClock ist die BeatMachine
       Alle Loops werden in dem Dict self.loops mit Index=Beat gespeichert
       BeatClock verwaltet alle Loops und startet sie nach dem Durchlaufen
       des Loops erneut bis es beendet wird.
    """
    def __init__(self, bpm):
        self.duration = (60000. / float(bpm)) * 4
        self.loops = {1 : [], 2 : [], 3 : [], 4 : []}
        self.index = [] # ALLE Loops
        self.play = True
        self.count = 1

    def get_count (self):
        return self.count

    def stop (self):
        self.play = False

    def add (self, loop):
        """
            Fügt neuen Loop hinzu.
            Wenn er schon vorhanden ist wird er gelöscht
        """
        _log.debug("Adding loop %s", loop)
        try:
            # if self.loop.has_element(loop)
            self.index.index(loop)
            self.index.remove(loop)
            loop[0].isplaying = False
        except ValueError:
            # else
            loop[0].isplaying = True
            self.index.append(loop)
            ## Testen wo Loop hingehört
            length = loop[0].length
            if length == 1:
                beatlist = [1, 2, 3, 4]
            elif length == 2:
                beatlist = [1, 3]
            else:
                beatlist = [1]
            for beat in beatlist:
                self.loops[beat].append(loop)

    def main_loop(self):
        """
            main_loop() muss im Thread gespeichert werden.
            Wartet einen Beat (=1 ganze Notenlänge) und startet dann die Loops,
            welche für diesen Beat in self.loops verzeichnet ist
        """
        # warte auf den ersten Loop!
        self.count = 0
        while len(self.index) == 0:
            pass

        self.count = 1
        while self.play:
            # start loops @1 beat
            for loop in self.loops[self.count]:
                if loop[0].isplaying:
                    _log.debug("Starting loop %s", loop[0].meta["name"])
                    thread.start_new_thread(loop[0].play, ())
                    #loop[0].play()
            time.sleep(self.duration / 1000.)
            self.count += 1
            if self.count > 4:
                self.count = 1

